package com.ms.qw.application.cvl;


import com.ms.qw.client.dto.RegionAlimentariaDTO;
import com.ms.qw.domain.support.*;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.ms.qw.application.mappers.cvl.CVLQueryMapper;
import com.ms.qw.enums.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static java.util.Arrays.asList;

/**
 * User: aglwkrs
 * Date: 23/01/13
 */
@Service
public class CvlQueryServiceMyBatisImpl implements CvlQueryService {
    public static final String REGION_ALIMENTARIA = "regionAlimentaria";
    public static final String CLASE_RECETA = "claseReceta";
    public static final String TIPO_RECETA = "tipoReceta";
    public static final String TIPO_CAMPANA= "tipoCampana";
    public static final String CATEGORIA_CAMPANA= "categoriaCampana";
    public static final String CATEGORIA_RECETA = "categoriaReceta";
    public static final String GRUPO_ETARIO= "grupoEtario";
    public static final String ESTADO = "estado";

    @Autowired
    CVLQueryMapper cvlQueryMapper;

    private Map<String, Map> categorias = new HashMap();

    @PostConstruct
    public void init() {
        categorias.put(REGION_ALIMENTARIA, findAllRegionAlimentariaAsMap());
        categorias.put(CLASE_RECETA, findAllClaseRecetaAsMap());
        categorias.put(TIPO_RECETA, findAllTipoRecetaAsMap());
        categorias.put(TIPO_CAMPANA, findAllTipoCampanaAsMap());
        categorias.put(CATEGORIA_CAMPANA, findAllCategoriaCampanaAsMap());
        categorias.put(CATEGORIA_RECETA, findAllCategoriaRecetaAsMap());
        categorias.put(GRUPO_ETARIO, findAllGrupoEtarioAsMap());
        categorias.put(ESTADO, findAllEstadoAsMap());
    }

    public Map getCategoria(String nombre) {
        return categorias.get(nombre);
    }


    public Map<String, RegionAlimentariaDTO> findAllRegionAlimentariaAsMap() {
        List<RegionAlimentariaDTO> values = cvlQueryMapper.findAllRegionAlimentaria();

        return Maps.uniqueIndex(values, new Function<RegionAlimentariaDTO, String>() {
            @Override
            public String apply(RegionAlimentariaDTO medio) {
                return String.valueOf(medio.getCodigo());
            }
        });
    }

    private Map<String, Describible> findAllClaseRecetaAsMap() {

        List<Describible> describibles = Lists.transform(asList(TipoClaseRacion.values()), new Function<TipoClaseRacion, Describible>() {
            @Override
            public Describible apply(TipoClaseRacion tipoIncidencia) {
                return new DescribibleBase(tipoIncidencia.getCodigo(), tipoIncidencia.getNombre());
            }
        });

        return Maps.uniqueIndex(describibles, new Function<Describible, String>() {
            @Override
            public String apply(Describible medio) {
                return String.valueOf(medio.getCodigo());
            }
        });
    }


    private Map<String, Describible> findAllGrupoEtarioAsMap() {

        List<Describible> describibles = Lists.transform(asList(TipoGrupoEtareo.values()), new Function<TipoGrupoEtareo, Describible>() {
            @Override
            public Describible apply(TipoGrupoEtareo tipoIncidencia) {
                return new DescribibleBase(tipoIncidencia.getCodigo(), tipoIncidencia.getNombre());
            }
        });

        return Maps.uniqueIndex(describibles, new Function<Describible, String>() {
            @Override
            public String apply(Describible medio) {
                return String.valueOf(medio.getCodigo());
            }
        });
    }


    private Map<String, Describible> findAllEstadoAsMap() {

        List<Describible> describibles = Lists.transform(asList(ActivoInactivo.values()), new Function<ActivoInactivo, Describible>() {
            @Override
            public Describible apply(ActivoInactivo tipoIncidencia) {
                return new DescribibleBase(Integer.parseInt(tipoIncidencia.getCodigo()), tipoIncidencia.getNombre());
            }
        });

        return Maps.uniqueIndex(describibles, new Function<Describible, String>() {
            @Override
            public String apply(Describible medio) {
                return String.valueOf(medio.getCodigo());
            }
        });
    }


    private Map<String, Describible> findAllCategoriaRecetaAsMap() {

        List<Describible> describibles = Lists.transform(asList(TipoCategoriaReceta.values()), new Function<TipoCategoriaReceta, Describible>() {
            @Override
            public Describible apply(TipoCategoriaReceta tipoIncidencia) {
                return new DescribibleBase(tipoIncidencia.getCodigo(), tipoIncidencia.getNombre());
            }
        });

        return Maps.uniqueIndex(describibles, new Function<Describible, String>() {
            @Override
            public String apply(Describible medio) {
                return String.valueOf(medio.getCodigo());
            }
        });
    }


    private Map<String, Describible> findAllTipoRecetaAsMap() {

        List<Describible> describibles = Lists.transform(asList(TipoRacion.values()), new Function<TipoRacion, Describible>() {
            @Override
            public Describible apply(TipoRacion tipoIncidencia) {
                return new DescribibleBase(tipoIncidencia.getCodigo(), tipoIncidencia.getNombre());
            }
        });

        return Maps.uniqueIndex(describibles, new Function<Describible, String>() {
            @Override
            public String apply(Describible medio) {
                return String.valueOf(medio.getCodigo());
            }
        });
    }



    private Map<String, Describible> findAllTipoCampanaAsMap() {

        List<Describible> describibles = Lists.transform(asList(TipoCampana.values()), new Function<TipoCampana, Describible>() {
            @Override
            public Describible apply(TipoCampana tipoIncidencia) {
                return new DescribibleBase(new Integer(tipoIncidencia.getCodigo()), tipoIncidencia.getNombre());
            }
        });

        return Maps.uniqueIndex(describibles, new Function<Describible, String>() {
            @Override
            public String apply(Describible medio) {
                return String.valueOf(medio.getCodigo());
            }
        });
    }

    private Map<String, Describible> findAllCategoriaCampanaAsMap() {

        List<Describible> describibles = Lists.transform(asList(CategoriaCampana.values()), new Function<CategoriaCampana, Describible>() {
            @Override
            public Describible apply(CategoriaCampana categoriaCampana) {
                return new DescribibleBase(new Integer(categoriaCampana.getCodigo()), categoriaCampana.getNombre());
            }
        });

        return Maps.uniqueIndex(describibles, new Function<Describible, String>() {
            @Override
            public String apply(Describible medio) {
                return String.valueOf(medio.getCodigo());
            }
        });
    }





}
